﻿using System;
using System.Collections.Generic;
using System.Linq;
using GigaSite.Domain.Entities;
using GigaSite.Domain.Enums;
using GigaSite.Domain.Interfaces.Repositories;

namespace GigaSite.Domain.DAL.Repositories
{
    /// <summary>
    /// СУБД реализация репозитория жалоб
    /// </summary>
    public class AbusesRepository: BaseRepository<Abuse>, IAbusesRepository
    {
        /// <summary>
        /// Стандартный конструктор
        /// </summary>
        /// <param name="dataContext"></param>
        public AbusesRepository(GigaDataContext dataContext) : base(dataContext)
        {
        }

        /// <summary>
        /// Загружает указанную сущность по ее идентификатору
        /// </summary>
        /// <param name="id">Идентификатор сущности</param>
        /// <returns>Сущность с указанным идентификатором или Null</returns>
        public override Abuse Load(long id)
        {
            return Find(a => a.Id == id);
        }

        /// <summary>
        /// Получает все необработанные жалобы
        /// </summary>
        /// <returns>Коллекция необработанных жалоб</returns>
        public IEnumerable<Abuse> GetUnprocessedAbuses()
        {
            return Search(a => a.Processed == false);
        }

        /// <summary>
        /// Проверяет, отправлял ли пользователь уже жалобу на указанный объект
        /// </summary>
        /// <param name="user">Пользователь</param>
        /// <param name="type">Тип объекта</param>
        /// <param name="entityId">Идентификатор объекта</param>
        /// <returns>true = если жалоба уже была подана и необработана</returns>
        public bool HasAbuseFromUser(User user, AbuseTypes type, long entityId)
        {
            return
                DataTable.Any(
                    a => a.User == user && a.AbuseType == type && a.TargetId == entityId && a.Processed == false);
        }

        /// <summary>
        /// Подает жалобу от указанного пользователя на указанный объект
        /// </summary>
        /// <param name="type">Тип жалобы</param>
        /// <param name="user">Пользователь от которого подается жалоба</param>
        /// <param name="entityId">Идентификатор сушности</param>
        /// <param name="message">Сообщение</param>
        public Abuse AddAbuse(AbuseTypes type, User user, long entityId, string message)
        {
            var newAbuse = new Abuse()
                               {
                                   User = user,
                                   AbuseType = type,
                                   TargetId = entityId,
                                   AbuseContent = message,
                                   DateAbused = DateTime.Now
                               };
            Add(newAbuse);
            return newAbuse;
        }
    }
}